﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Modelo.Seguridad
{
    public class CatalogoUsuarios
    {
        private static CatalogoUsuarios _Instancia;
        public static CatalogoUsuarios ObtenerInstancia()
        {
            if (_Instancia == null)
            {
                _Instancia = new CatalogoUsuarios();
            }
            return _Instancia;
        }

        private List<Entidades.Seguridad.Usuario> Col_Usuarios;
        Int32 res;

        private CatalogoUsuarios()
        {
            Col_Usuarios = Mapping.Seguridad.MappingUsuarios.ConsultarUsuarios();
        }
        public ReadOnlyCollection<Entidades.Seguridad.Usuario> ListarUsuarios()
        {
            return Col_Usuarios.AsReadOnly();
        }
        public ReadOnlyCollection<Entidades.Seguridad.Usuario> ListarUsuarios(string nombapell, string idGrupo, string estado)
        {

            if (idGrupo != "TODOS")
            {
                var query = from usu in Col_Usuarios
                            where (usu.NombreApellido.Contains(nombapell))
                            from grup in usu.Grupos
                            where grup.IdGrupo == idGrupo
                            select usu;

                if (estado != "T")
                {
                    if (estado == "A")
                    {
                        query = query.Where(u => u.Estado == 1);
                    }
                    else
                    {
                        query = query.Where(u => u.Estado == 0);
                    }
                }
                return query.ToList().AsReadOnly();
            }
            else
            {
                var query = from usu in Col_Usuarios
                            where (usu.NombreApellido.Contains(nombapell))
                            select usu;

                if (estado != "T")
                {
                    if (estado == "A")
                    {
                        query = query.Where(u => u.Estado == 1);
                    }
                    else
                    {
                        query = query.Where(u => u.Estado == 0);
                    }
                }
                return query.ToList().AsReadOnly();
            }
        }
        public bool AgregarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Col_Usuarios.Add(ousuario);
            res = Mapping.Seguridad.MappingUsuarios.AgregarUsuario(ousuario);
            if (res > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool EliminarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Col_Usuarios.Remove(ousuario);
            return Mapping.Seguridad.MappingUsuarios.EliminarUsuario(ousuario);
        }
        
        public void ModificarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Mapping.Seguridad.MappingUsuarios.ModificarUsuario(ousuario);
            Col_Usuarios.Remove(ousuario);
            Col_Usuarios.Add(ousuario);
        }

        public Entidades.Seguridad.Usuario BuscarUsuario(string nombreUsuario)
        {
          return this.Col_Usuarios.Find(oUsu => oUsu.IdUsuario == nombreUsuario );
        }
    }
}
